package com.awei.aweiaiagent.APP;

import com.awei.aweiaiagent.advisor.MyLoggerAdvisor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;
import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor;
import org.springframework.ai.chat.memory.InMemoryChatMemory;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.ai.chat.model.ChatResponse;
import org.springframework.stereotype.Component;

import static org.springframework.ai.chat.client.advisor.AbstractChatMemoryAdvisor.CHAT_MEMORY_CONVERSATION_ID_KEY;
import static org.springframework.ai.chat.client.advisor.AbstractChatMemoryAdvisor.CHAT_MEMORY_RETRIEVE_SIZE_KEY;

/**
 * 个人生活助手APP
 */
@Component
@Slf4j
public class LifeAssistantApp {

    private final ChatModel dashscopeChatModel;
    private final ChatClient chatClient;

    private static final String SYSTEM_PROMPT = "[角色设定]：你是一名全能的个人生活助理，能快速响应各类生活及工作需求。\n" +
            "[用户需求范围]：提供饮食计划、穿搭建议、工作方案构思、项目难点分析、天气查询、旅行路线规划、美食推荐等。\n" +
            "[交互指令]：请清晰描述你的具体需求，如 制定一份适合健身人群的一周饮食计划、分析新产品推广项目的潜在风险、查询北京未来三天天气等，我将立即为你生成专属解决方案。";

    /**
     * 使用构造方法注入依赖
     */
    public LifeAssistantApp(ChatModel dashscopeChatModel) {
        this.dashscopeChatModel = dashscopeChatModel;

        // 创建基于内存的聊天记忆
        InMemoryChatMemory chatMemory = new InMemoryChatMemory();

        // 创建客户端类
        this.chatClient = ChatClient.builder(dashscopeChatModel) //设置聊天模型
                .defaultSystem(SYSTEM_PROMPT) //设置系统预设
                .defaultAdvisors(
                        new MessageChatMemoryAdvisor(chatMemory)//设置聊天记忆的保存策略，这里是保存到对话消息中
                        , new MyLoggerAdvisor()
                )
                .build();
    }

    /**
     * AI对话
     * @param message
     * @param chatId
     * @return
     */
    public String doChat(String message, String chatId) {
        ChatResponse chatResponse = chatClient.prompt() //创建一个对话请求构建器
                .user(message) //设置用户的消息内容
                .advisors(spec -> spec.param(CHAT_MEMORY_CONVERSATION_ID_KEY, chatId)//设置对话ID
                        .param(CHAT_MEMORY_RETRIEVE_SIZE_KEY, 10)) //设置聊天记忆保存几条记录
                .call() //执行请求
                .chatResponse();//获取响应结果
        String content = chatResponse.getResult().getOutput().getText();
        log.info("AI回复：{}", content);
        return content;
    }
}